/**
 * 文件名: AES256.java
 * 创建者: ying
 * 日期： 2019-3-12 下午9:33:13
 * 来源：ying
 */
package com.lynn.common.utils.encrypt;

import org.cryptonode.jncryptor.AES256JNCryptor;
import org.cryptonode.jncryptor.CryptorException;
import org.cryptonode.jncryptor.JNCryptor;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


/**
 * 文件名: AES256.java
 * 描述：
 */
public class AES256 {

    private static String password = "McPeARaUsOiAKwquKr5odl1ZQOg5X6zrn";


    public static byte[] encrypt(byte[] msg) {
        AllowAes256BitKeys.fixKeyLength();
        JNCryptor cryptor = new AES256JNCryptor();
        try {
            return cryptor.encryptData(msg, password.toCharArray());
        } catch (CryptorException e) {
            // Something went wrong
            e.printStackTrace();
            return null;
        }
    }

    public static String decrypt(String content) {
        AllowAes256BitKeys.fixKeyLength();
        JNCryptor cryptor = new AES256JNCryptor();
        try {
            byte[] msg = parseHexStr2Byte(content);
            return (new String(cryptor.decryptData(msg, password.toCharArray())));
        } catch (CryptorException e) {
            // Something went wrong
            e.printStackTrace();
            return null;
        }
    }


    private static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    private static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    private static byte[] tohash256Deal(String datastr) {
        try {
            MessageDigest digester = MessageDigest.getInstance("SHA-256");
            digester.update(datastr.getBytes());
            byte[] hex = digester.digest();
            return hex;
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

    private static String plaintext = "Hello, World!";


//    public static void main(String[] args) throws Exception {
//
////        String content = "0f607264fc6318a92b9e13c65db7cd3c1332444444444444444444444444444444444444444444444444444";
////        String password = "zsyy";
////        System.out.println("明文：" + content);
////        System.out.println("key：" + password);
////        byte[] encryptResult = AES256.encrypt(content, password);
////        System.out.println("密文：" + AES256.parseByte2HexStr(encryptResult));
////        String decryptResult = AES256.decrypt(encryptResult, password);
////        System.out.println("解密：" + decryptResult);
//
////    	JNCryptor cryptor = new AES256JNCryptor();
////    	byte[] plaintext = "Hello, World!".getBytes();
////    	String password = "secretsquirrel";
////
////    	try {
////    	  byte[] ciphertext = cryptor.encryptData(plaintext, password.toCharArray());
////    	  System.out.println("密文：" + AES256.parseByte2HexStr(ciphertext));
//////    	  byte[] decryptResult = cryptor.decryptV3Data(ciphertext, password.toCharArray());
//////    	  System.out.println("解密：" + AES256.parseByte2HexStr(decryptResult));
////    	} catch (CryptorException e) {
////    	  // Something went wrong
////    	  e.printStackTrace(); AES256.parseByte2HexStr(encrypted)
////    	}
//        List<String> ck = new ArrayList<String>();
//        ck.add("1");
//        ck.add("2");
//        ck.add("3");
//        String fy = encryptString(ck);
//        System.out.println("Encrypted text: " + fy);
//        String decrypted = decrypt(
//                parseHexStr2Byte("030161BE19F014B61AEE5CAADE7C229D47477417A61BB297476C5A5BF123A6FAFC099AD8A39E1507C31C983C50B697D36636FF67ED3D6C9AB5F302F16EDB2E1E9B9BA9E2F6B5119E3C17597F12B0D6D6E845732B39FD7FA851406C1AFAC04A2995606F55CEE95C4F51FD71EFB1905A0B3425395087DFC26156D55A6A0BF360DCE38EBCD6CB4FC152077484FBE92694CEBF7E82FE7A110EBFA6058B0A4D9608625BAC28A885EF3BA364A207A65B1DC63F4D855B170DE56AC8A239FDA0EB7AF2A60EB6ACE4188315E4762D7EB5EAC259F80799894C6E77AE83E0BE93D5A7B24139B821E9359354F417B963DD712463486DF425295DCF764CE955C1C8717871A4A057DEB1140B98E7C46A6F92A438B3BC68B91A2E5FE485898E089A7CB9B0F2C4C7A54A6A840638C90EFA006D75BEA7A6F1F624B764C9400576170D3F8AF31AED1EFB38D7962BEC0899A42BA67E520B7491653EF843D5FF805E505409BBFB423E3D4E3EF285832B9CE18959A22DAE44A21B04F58AFC57F54FC8E651A0AEF219EB99CE00CB918CC516FCA5E7B8D992BF8C2224BBE152AC711109A16AFC9B23EE29B90AB03C99EFCB5490578FF3665E35BA279BBA59207B5A715DCCBBBBB9C967AE659499ACC2B886C271732CB9D2BE630F5C652FAE45C9F67CE832E428DA93CA9A45560A6803DF8E54AC3CCEFE24108F6AC21818B85ACEA08495629C9759A40805B6C994321402696FFB68E7D0590CCF90DD72B473C0B84F66BE00B10859F0FCD9FF5F0C192AFFBF57CFE3D90D67A8A7D83221AF91C294F84D6C3DA2175BBD304CD87022D909718D707E8EA2FD0A5F60CE3F81B57B4352CE5A14131053BCC05C6DD90A98A0A4CF587231AE9BFF2BD0F880C71FEE72C6C2AEEEEAB16C6DE48B7688556F3757E8959DEB26F659F236CF69EEB6D756C288785F1E2B9E2D041BEB3F0A7ADABD63899B2FA5265DC74119998C16D505D1B4819BF7A37F20611C33D2FF8D4FF4A59F9224A5AD6CE8B1329D12CE5755AD9C624E08F3122E6719C73D17C43A06DBB2934AEA4508EE96124C8DA209CE8B298DD49E4E01F660FFC839E7259F3EF36C7BF337F451B9B8BA7A82BF33BD209E0621F58A1A91910DB90B256A0577AA089F0A90B8982286833CEF6063F393F535458543B84B3D55B9254F5D5B086290E70460034004C23289FE02F1F761348D3F345A6F1A8865F8A85457DCB32445712152EB7364D48ECA5A18BEF6FD67C5C7D2BD3E3A9CA7F4C81699C11DAF1666EFD634B04A3D29A9DBC3BC3E812EE6E38C7CB52E82366C50781794D33752301E116E228BFC0DD52035F1283EB3CE911FE3A4FC4341890A2633FA003690C5A61E451FCD08ABF4554B76633025C6BA2806BEDB4FD681F08A7D3C8E2C9879DF6C9C933B99485F26BEEA569C7E7F151787A0C3CD0EC2EEB62905C6ADD3ECD9ABA3BA68B648AC56D035E71069A23305AFCC6D77C9233386643FEFB20649374612444AD8C830CC98ECF9E271EA15680B800529E2E823683CD914D9F761A14C9E3F25667C2A4D64E5A9C8843F804830FC6AF31B4D6124DC8282CAE13FE069FDE61BAD06BA790B6D070220EBB992D520B1B4F7949FA336EE1DC3D661EBAE29C77737ACC3177BF71F2CAF231F559BE3AADA9AD8EDE3994379CA2D20573AA6BBF014C677CB032163FFEDB727136359884528805EBF17F20DC36955A6E17FE47ACEB188D33A19CA4E3C94F5119CE678F2AE20544FFBEFE478727A5AE08927CFECB569C9633003C807AD40D1E189C39608BAAF8E6CFC516883F50AC5935DD9D04E4F5F9888A4EF372390EA39F0A7C2B3A8306703A4CE58CC9D294AF156FBD5392CF07BDC2A4D96CA452B57AFEC98A389BC8CEE343F68E7A36C25D085E78EB5AAB6856C0728BD41B86DF7989BAB5A5C6349C7EB11A13A641D4E020D2BA300A5B33A9AB3D194B23A594A93E7AC7596A36140A1644F346928E069C427D0217406E3178457B86DEA4262BB78200569468CE2BB30DB5F5568D6B1B0914B8D317BB5B2EA66E5826ED22D0DDDB0480CBC84B1FD6B8D92C74D1D248BE157A2A149679A1F43F98F25AB11B5741BC3240B96F1D758A0E5ABFD7D09CBC04A0C0FAB7017FB3A29B57F636F5F9C855EDE9298BA2EC32A66ACDA4B3C20CD1337E59E064B24EDE3B561B26F65210DB2B7B0502B2B25C025F94D93C7CB4D3F45EC5B81305DAE14A2A1A1BCC4740139B55F990844A42B7F5C4F55F00A7DEC62D6BE5B3789404C57874E2DC578F9E154FE031B7218326F6CB1A65AD1A9D3CF8BCCA63B71E57AAE00F5F8B6C6344371E7F498E819A97C9E782BED9B73F09F1924C705770AFBB80487CB04D875AEA1F88E96E7B0F5B2DC51324F5A8CFBC7AC58B7807DD0164DA146C4141D48D3D7CD80FCF9A9C352FF80A2E049F994E306B19CEC6EC471BC5D29DC12930CE132D9F8ADEBCC3A8AB2DBFA5D278E6D2343FCDED938F05E46EBEBFB149CAA517736A4338A682806597B71B0C6E7459D8376D36210A3ABB7E352ACADD6BB9EACFA05DDAD00C3ECBD1066C1C093F02ED0A1BF3695D8BB31CED32BF217BFAFC1B333A09427BB91C94817B35E72C5D8D803136BED9FA337CDFC88DAE7457A4F38B0E8DD3191B6A51FACFF106846B91691F4FF7E2DDE79A9509B61BBA5C7BBE9FDB1B6EAA706910A59C4BAF0AA8681D1B0C98B3373C23503A475524217512A1211BB0BFC8F823B4C5A844E419509A5E32F8975D3F826E3D6BE1D2E4F5FE4765FA6EF6F2704A118B2E648266AB208C42325A40F0A8924E361D884ED0BB52CC278BDB435CA1AC1AADE8429685A64C098697ACDC26A2D1A5907087DA9643AAC2C594E9EB107CECCCCBCBF368ED33A2FD1F4F21E51840FD2ADCE9CC3BFF7182026476CF1EE51A6EB36FE18B229763561B3D709B6A1DAB7ABF097C824AEFD2A90E31B4DA323BACA5D9B0C7C8826F6EB598E29E046FE59D6C7AA63B07842CA5B0F86C629209D9FD7FD874DCD446F2B6331956FA02B1111517075E859A9FC437E1BED52C96E3E011D763FC582DF4B20ED8E0BE057273F8687B88E9B2512D0024916C34BC6637268CA5218A212257011F20737450FCC613BA943CADA16A688353560141D9CB3FDB4FDF604372B96130BBA5F931D09A345D9FD940BBE8FDEFEB8AC92360F1327F637986153F1E4C14D89AD177D28873564FF9674116813BE36E55E29C4534B495BB59E5B08F1FC0523F19211A7974F872F522C2D7BACB66524919321C7E9B24AD504DFDC6940E2D31728965FD345FA8450F88ABAC4D5AAA1A03E098115E2F12D9517430B4315676A3628649F9D9DAB3173F424E033B2AD7671B92D961283F1BAB113E40E4520D4B48347363EA8CA4CF71943B615F4C5937A3C72314182797E900FCD0D52F842DB133BE79BAC04CA59BECAC28DCFC2A8FE342E29BFDA152AE189491A0E2795D1A3B7FEA4F0383E91D8F0D3A67866BFFC40D5E161D5A2D9D2E3266BC6AD1A32283A5F9D03756F34A89961E94338EA52A1BD8A4EE1C9A8E00FDDFB887D1A2804F63D165898D03F5E305ED926D61C99F29C1BC5544876A88886C5B4B5E6925E12F6027B1670F1DE7BDC8BFB0E3C0D19F256C000AB5EBA1CECC8FEC43D9D46FF68039AE317BA1BC563E2E1C224C782E44137213D6743274D0CC0E6AD4DCB1271839AAE38E5926A231D27399990F69A4E66C045A5F16841295D4C6627EAC0A10E9C234284AAF8DD3F82E80C8FCF01DFDE208B80CC98DD7B61AA676619F211FC7E0BEE84732BC41306A565FB59A8E6685AE59AAFB9DF76C53F5027E213426B661DFC2156B6F621B78F16B0213CDAE8BA922A0F1780184E61C78E4404D9C604767B29F5A8D21FD752152AC131CEB325927C1096F67732CF28FC78262B561B2E7F9B3D911721970212D24A5191D86026F421330D0052581622DA65095589E3828100A855E4EB6F38291B58513C4767E41D7BD3C5412667AE799C4BF8279617FB56C268A7B6DA37161B6D3CF9FE6FB6B2AE97D909E90977437710AAA275C0F9BFA831E1FE4D115D4A2E78C6FD876710DE10738FE3BD7338F70A4A0BC80186831698CD2F779B4D614EA8B12C09032E9BCE63C200D844FCAC309C057F462C70DDD794038A7ACC54129A736CC3986763E203834901BED6F754E49EFBBEEBBC90505CC9D963C3DB7E0A71C9CDB62C7BBC74F5DBF5304BFFB47344ED1E5C3AA1FEB18B70ECDB28A17F6FBA445A32E761B8AF1F94019A1F646E9093FBEE58F2DF9AA5A0D87053781DB7BD034C0D54800701D70ED9FFB4B3ACF1CD94F5685E18523DBB8EC4A449AAE8379CD1BABC2393CF81B0A8C912528314F3BD14FCFD6BABF416F31D8424E6DF6A46330F38189ACC239F86912A67BA9FCAC387F85F5D944F0847084B6783231E27D042267F37658313E4A2E5596CF7B05FD25EF8E23C7D5E7C47434626A331EF4208291DAEEEAF9AECB0A6A28A98E706375D1F59D4EABBE249C1ABBA60BD555702750D9F80490C1536F818A1FE94CE55190C55731E090BCCA7357D0DD522E809C9461012DF3367FFBEFC01D223942A8427423F00E89ED2B9D574EC8B19817DC4C47DC08910093105EC15A0488B8EADE4E2D8B768516DA6B805613DD3A19EC943ECC2FC946DD108B80FCDD2F2D46611857AD344930A2CBCE8D54782578F655295D1AE725EC82B4D96A6ACF3AFCDD191EE6A9D681AAA2E021285FE6D0DD3FC2A7696604494698B464E2F3F073EBADBA327A4F9D561FB6C7CFA0DF71D6B26B4584F78E6F0CA4E0A04C8BDA836DA876239E5C424DCCF1A5D737B260EA1AAD055947F6D5BD3501101598EC70498C5E930AD9A527E9DDA00C60768A6573B88BF282A2B00D5D60DFFF0592BAAA2EEDC9D08BC31DB06BCEBA84CFAF1F257E7B7319CB67B10628D9E92F61A1056CAC54EFC4E18355A0BA5F27A4FE694DE2DC913807E0EB9A77423120261014ECF6613A05C528C31847C7557380351336072E937C6338165C130B8C056DC9527DF61136569A106FAD1A794095C57ADDDA5690A423FBE647C6840461ED56A004C236F337AC62BC79491DAC15B10E45C2349A5D196B403C02AFE621D30F20A16F0CC16F5E1369DDD07E90170969BA42A6537694380B7B995A8084A3D15F76DBC5926BE5468EECE23B2570D7AC260BDC7C7C285E64F9166A1EACDD205AA66119952D473A65DD05CDE8B951AC702123CC7D3433E6DAE55857A05DC981F8F6EBA836BDBF3B79130D6B1B6F5FD1CB19DE463EF90A9014EABD8EF84B79ADF51DD13782464DD789EB59B788AD0313516DF608FBF910BAD962B40A226F78C477029EEDF69CDEC9F1F9807FDBEDB47AAA03471384AE8765B3B79C7FF4CE4E8BB8251FC6F8F795CB437E893301459E3081AA166FA758A48A29B76985A951C1E565C7E0C13C4D01BC41F3495EA5E912EB088B714EFF53B19C6A8991D25EFF06105C53FAC62BBE7D7B6CA2A4501D18C80C866987285C8D6F89F8D0E166D8937D4AA622E22A2FC1BD58E46842AB61AD89AB20E25086860FDEB0985C030B2A26F9BF2AD20DF25A0DA5D66B8E8550661ACA63B96CF19ABCFB204A0DCE6EE85CB3A6B22F5D8F89C9710E3A2C6D0C070B3C80AB69059204B6461389BF7FAECD4821B48F2587093C72AF407B33D8CA3F2EE79157E3654690EC67CE29670CCCECA94A9110261C0F4818EE2F33C6F9DF5B97CA11FB88CD7EC34881167BD2F36743F0C7F12395547B6BC8A436DC88C297E877DD471F2533299F6A93B8D5515AC7F97331C7669F011B04A294845BD9E25CE96D6B815A40B50D6C2CCB6F130FC18F8744B5C4F26838D69E0B44290EEDDD974A6C15AA3CD3BC8F6E29D9ACF3087B7AB5C5DA78DCFB2899834AE1DDDFA0373A82AB186B93BEC02ABFC96C2C6C186AF11BEDE4CAAAB03EF42C623B7F8D138327648712280858F1F320E3E2B2A77ACAFDBAA535D96EEA7A0004CB57466A99FE82FE986D95A72ECDE781E5A6C6921F467A043725AC98FDF7FFACC5786AC6BE9AAC97A5D142D22A0C8AD332E0FC2AD2D95DE2A7193D5052C1749299A37EEE7489D084941A3C137244797A5359F064B6D403A1EF0958D80180054D0C6BBC5D05E3DD7678523243CFC73DCC09676106A57BBCBCD65BDEE3FCEA64E1850F90A2A1D7987E579091DA10F1F91652DA69761A4A43CD8D10375C92E02B9454A480C287CC2CBB2B902FE4FBABCDD0727BA812988C675B67C27145EC94ADC4AA1560B599E57E7D61FB125EE9FFF1FE4C96A722972D15753DF083DD6738521214D35FC47DEDB73FFEACA0E8EA2482DAFB2CE3626206E53C4BAE946253DB34940A594CE097690C3B1566F07E95C2F9372D0AEAD79EB0337C68967AD0DE853C94869FAD2911B4CA7E09213B1D9798763325C95E042DA3BB6F6572229CC53D828CA75D3DB4ACDA5340AC9EAAB784B7D97F410C3D6AE95CC2A81F17D2220E0CD90DA5E794CF6AEEE2BDB0871F0CB60ECD9FE5DF5BD22FF53A5F6F3560939D0692804D55EBF0B71EB13A089A259B2608BB6A96DC0ECFA67B37947A93FD0060591FB8C699624A1155F83FE804A79879B824DBAD3C0AFFD11BECB27D9E85512F73A267F5D5842011A3DB12CD8CF4E50B768C5537454827334A060F309F8AFC764831A21BE234E3F2186AFDB943FA36032AC406E7E487EBE34819378C3ADDC289DEA9A9D22A336CCD6AD75002F2B0A6D08379BCF28BB99247652E87E3ABE255F84CF132428E3A09CE96CA82B8C24164BF70A3CF8AE1D125433A548D010BC94C7B4D9CD3D45359A396CEFC34C9F38F75C83D1AD3AE0BE97C81C7ECB14C8C82C1DF127E50C5A6CBFBA14B17314F266446102C8794CD9B6145CB0D6F7732E8E9AEA0600F01A6A19321E967AA3AD7DC7B89A6491D6C2383F44A0720961AEDF0A81C38955BDC681BF54074013751157AAA77F7BC800531E0898E29A36C63644B3B13BBAF9372A3120935C42B341CDA477BFF9DCE348985A810D416EB2DC2AB552808ACBBBD36473BBD472D4DCA34D88777215B922D81FE76607D9248DD3C3EF89B2A5197F7599934C9EB48C0F0EB1D17EE6D21866A1639408097CAA61201D8902C36794BE908CE2E66EF9F15E550045CCFCD69EFE10D356C3E3DE07BED7260267210A23445DEF4C47161638210F6A5C46D70B8F2B4ECB296BE8B9AC87A9A649D966158B951EAEA58A208B0FDB2C970864741FD2176ED9626A3FBB6BF687CDD7E90D843273B8626B22EE1E2BAFF1663BE6EC3FCE778659D87A6B4B54B9AFBDD94DBE00D1D295E609FB1DB07A1199F0FD14372D1A38333C9DF37A7F2BF086F315E1A0524B9D070486E0E7F81F640CD589DE83289EE86E79D5A2BD328002EF80DFED977DC625C45C059AEC12C7714C2C0D9413F17BC5615C9297C8D5968564237B3A3D87907CB3387D89A76DA46683778040F8CB0FCDFBEFD3E0D0BC38A58409DB4122C1C98CE9C54DCDC40C92B19C0C185648B497C4902DCD9AB4FD0543246EE8DD49B994D491A734F5119234BFC92F632F6D7A8E9EB537B7E53FF4711CE8B93D37161A7FA17B88D31700BB659E618A1E44F5A00D96E3713FB9E980D6A780E2CD27669C2518551748970911E8F9D9038CCA2F081FFC295C83D1D6A45D1E2DB8F26B35F2017187B05DB1FCD6A9E86B6D8655A0D4B985FCFA69AF4B2C777CDEDC893DCB1191AD0AB6275496D0D0C620F38B187D491A2A4272061AA09E132827301C3A3F13E8B721828A47D661E3C44BB9D7BA7E055D9DB46F49DE21C7BBDA19BBF971B13C7E19CDA33BD50958532601B0A07CAD576005ADA84A8B52554CE881AFDE44C1B04BC0ABB8B86674A43F1EB737478D9A71BB22117DE0A0B563DE4117F5FEA0814F93404325300C6A4CD35C5E8E144BF17EF426533C7065F854BA057B8D722C9A21D2FFEE227C17EC0F388B263A8B32FCD335ED4AF8FD0A2F4F20604BFD356A38645CC106F56B5C44FE419CB033C01A44D304D0F0139F58A04D051E4C60F20304945BDBC7F4D5CDCEBCCB1EB098216D757E1405A5BD2E95717409E78A3E947B69B01166BACA31ABB0CCB5B3086A31F2676BCEA8ED029844C9A92CC59AC76B1D889D1D3F94D2D9EE7B14DC79722666E47E82A48E30C82CC4F43FDDB72A558703A33B96BE031B49C335BC21D3F828B2E2E4716A6BB36C31D9BE90545D3686824F1C7B702D016E0FDC9208DF2E28ADFBE62E86E934A8060E9CABE9231B38F415D0418D2695BC10370DE2DBC382786501EB272F1A41CF19E1B377999D6B6A61EF6F31A81DE18E2E6748DD3AD489582CEAE3327B2581E039EC5FCC0E920FB2BE5A6348B22629E6582D20E7297594C84FE9D18BF8C4FCB4C40B97F30457FF40437574A21CF5F93E758382F7A6FBF1E0BAEE14DFC7CBEB8FE3F93BC55C784B3E10B54CB4B3D31A0D6A80AB1C41758C0087D542407BE3B2702C56BC1F97B781520180B8F3EE444A59887484BB68AC1C20F251A7F594291D3CB2C4A011292C5FB50C592073A808EFA8FC9065EE326F722512403DC2125C79DEB7C1E797D12A8D10750901FD1B30666E4D786F2582F8E0EA658F537E57797CBDEB9E985433E712F20B9841EF3D87B259D3016C3F6CE39AA27D35D0E450A4B7C132A79756C95C4CF27F70F138970C2D89ED5463CB4AEFA14A1BBC6CDFEAF12ECBC267848F18B8FF420436941889ADF7DB79F4E67AA473CE5AAA0AC6E52F71EC6E52D24673563447893AA746E2851E31874407FFA40DA23356D39E5FD365FCA17672DB66CF643E5CD3009291CF0EE21BB1B44B6D80F60CAE6D23EEF59C823EA0DD73E109F77449A3A88BC3B4A5901F1FC91CD33A3F3C94756CDBD66EA37837186F858B5C7081EBBD44387D4C869B5056840D0D60FACCBA501D39A42D8D82D6C6040B35BF3C254989DCD3382E034D4758F7DCAA07F18443859ADBE9520C45413326B0424A39805E0DCBE0E3A14F9CED591FBDD2FD365E3DD8BCB2154B08D7CA4A95E9A00017DF93DE7723176EB536D454CE5FD0E95E811BB952422ACA57ECECA411B7C0CBE7DAD94E4813C92524034590525C680757725FBDF1930D70926CD09496CDE11ADF5B4A101C58F6015AAA49CB621C7D46FB3B5D05D7EB121AF46BC3AE6AD751CC529D30E69C6E5E026C5A0BCD6FBB6C3FD072F8F2DFFF5C732A47D385A6C2CCDF8206D7D4BE268238A76F49486762694787F7B9543ED63FD48BCEBD531E78735A6E098522EB9C6649BB1415C7B05F9262392D1EB32345EDFB44DB41F781D93F8B3685B372DB94E49EEB9E5700053D4E704CECEBD5597D46F6AAE8F8519F244E128C4BA50CCE6A750B382609601CD5D9A2F480AC464C54CC8CC73CFEE5DABBD1BA4B51FA6CD506D03D04461DB26E0C021E3C2F417CC50A41F88ED7C4788C26DCD7B79F97D381815676593E1734181E0486EE1E43B8228568B545535BE158882CDBEF4B6CC715E758E7F9C7FD111151540B01B7495F82C9CF6C33459F595C49879C2E5B4F027BA499D37F84489D1B1FF32416A147FC2900807F62AFB1291730219CC0AD73704F0187BA80B77E3DB0085CE375762E9D0FB063DFAEB453DC5B97B03C2F1802E71B16F61F8C9275647C624EC0E04B15022099285D96E73BE85D525B4ACB9F70B6DFE7E2CEE06065967A2E9F7CBCB4E1CE24B1AE17A534C202CAA7E3C9AC3E6573BB2F63329B80DC6954E93156B40197098AC07429BE892A95A520970FEA5DCC336845C23533C59CF74926149C2A032543D0B5980A871A62D87465985747E52DBC258AFA9CA601091AB4606C3E59F5BDB52A2E0D67B95E4D75D5D2BE82AE02BFCC794AD5AA015040156F4556EA48E5C956072B72B259EE5F4EFAE9067583E0B43EBF11C3ACEBB7C93BB1397C26BD054A4B41EA7178B4B249BB8FD706E171FBE5FAEA75030653F275365F851E8D2B7110E8354F505A045CA0F9CE7D3FF9EA13C9A55A61BE70BE29A8A7C326A00637FFDDCD430B0A33C5A62368E69855671FC63C24138A2D3FD6C3E6E7D418DBEE0658E6175B6ACDBB59E995C52FCA3C4B64C3AA3BEBC56579C77E8151B3D215D15966EB612E552085DEF76F4D18C7E8279FAB541976611325F1D8A72D545CFA323268315B545F4B3E0F34818A0E31EDC85F447874EDC1B3255F3D9275EA1A4021731CA535AA1F42FB09D4791ADD59ABCC6192FD85C2406C839EB0D0EFE9353AB3EE7F7B22C97BC79D3023C214B26144C32B02D4739FD1CEF21FB762D751FFFE9035305F54205BDE64AF204E610FAB0CF21BEEA912D56255C95EC3F219A7995B9D10E69B99A5386B2EE4FFBA670C0B775A097F8B5B974BEA9203E3E5A99D5299C6865F0143DA913CA7A577D9629A9A9E5D4D5498718A75BCD04FD4C9CAC0290D9096D96B3B400D9B799AF50E0B17A7A6AC223F62F8F6F7B9D37CD5731BB371200F8998CC78E1A2529E3A71B61272B8DFC38A9D754920E0506D4FDDA34EF60133E9CA6B55ED13CBE187AF1E0653D8519B017FE9C4AE15BA31F3290F32BFFB7277513DD2DD390D0C524920BDC4CAB509958F34E20B9FF989315F27DC03FF0A6B48BBB75F9BEF0F2E499D56975C7FE311F6CB8EEBA64EC3A21018D5461E133AA64C1C4E775E8ACD18B209B258DEE7525E9DEA57D242A577C01B03458040F345CF31B4F2DBAFC5CEE5B624165823E1EBB225CF634F7565DA7BC83E9AA564D7780042DEE7B3EB277407241B7AAC2774558BC3076BFFDE9A7083608B6AC5F880E12431B267A8F00B7E38B256BC3D2FF790EB8A7694B119FF9F5B79E417F575A93F47D7F532A6383F508B86696694884B0F9879E6AE397B7BE4348B1BFB38BE67E8BE3A63950AA2C4FDD5FB5F52F8CB878801F2097F5A66C2804B9BA0E2AF81DBCB25FA0B8A2EC0B1C762B9B6B52044E4FF1AB6831BA67BA8C5449D294A28A30485E8EA252FF883D28B4A619A5F5FDE218A7D17090450D35B4196EA6BC1E76BD274FF29CE540C4ED551AB021257EA1F8C299B785745451EC4D508BF091037D527E0B36A473D224C106A76CA7C84492AAAEE06681EFB9A32828474EA369077D65C9F19CC7B0367C160011FFDC02FB564EA9E1B0B864973C6643302AA6A11FA5E7EAA9C9C2A8B0F53FEDE82AB2B504F127F8B921AF4F784833A1017A5EEEB1387B91A2308158DD81EB6BB656983D33CADF3BE7A81969EB0525B39CAC2BBB2B69999C6C0253FE77150B10826BFC78119829C97E219B973BD18AF7D471CC8F7B50C6F7B1E483A57C3BDBA65B0F46A6512BC70DC2967BE621A5B7D358904DA11F351BC57F8BE30FE6EF81C4EE5307E5F171448111CE93EC6EC244451CC3A851E381D98495698EC5B618009981C2E5A217D4333ACDDBA45854FA23B4AE102A0AA12DF99541BCB7A336F4F64CB7DB789E70F25A19FDA724A29D1F84E651BBE450D0D2AA70A74432CA8F67D13480B9560A6E7F224A6BE297D96E0B473876994947AC9E735CFD242D1B0658BF86E684891A2DAC8DEDF25C58B6DAF49E41BE3B386530BBC33F9A73F874FB81809D033510B48D9C621FE2810D90CC25C2C20B0F2092B71C852C5F265F873E8050234461F264C0B1C5D08A9E3D824AEEE922F12446923A74E06F43751283C8DE4F1A5EA86436F9B2F4758CAF2430A54A281A2ECB64742F4873DCEBF1481E15616B49111BD9B5A83B21934FA99D1801C8884D64CD583E16D08E582EAC03D2E17B0AABCAD82CAF2313CFD2FAC8E614AD33A98CC07BE55E2B54AC97CCB54EEDC06F448E286BF96FEF4D987BE4C3CCD15F18243499F3B59443F35A5EAE1FF65A91C4B3D2F2A4F25B6DC353B12B0708E17E8A1318C4F6B1C9454376CAF0F9B9B7ABC22BB06C74C4AA8E1E1627EF6061FB2289E3B8DBD75C9CD0CA6BD8BF2662E77DBFFBAD5B478970A75CA555F18AE11749A6D36707D15F1321A9D0BD0313A110638960D165F4B55C26F6E8E314849F52A053A0B1B5C9B4A384C845EEB762D1CCD69CDF3F566048F8B555D9BCD84755168EF15949591054902FF76379F83C577CA2760059A440F93E10EF533642901FDA748CEE177EC7F239A687AC0C76BE4A74D1B7B9A6866C434B2690F1E201C9E79AEC67A098E1852CAA4E11439F351D14739221BD2B0996E21789B7B7660F01A232DF13E13330E0E4BF5A69BC3B0EBA586FA4CDCDDB03CE34C558EFBF96173A7EEC69CDF6ADC577415D49175CE4A6217D046EC80E362BBBA674345343CA77462497F5B153DAC73B6B71B81342F9C3A707DFF449E9608B98DAEB0F10284749864BB5FFEA6429AEACA884CFCEA014DB9D0852C2F5266EBB5A3E37D2DEC11F361BE8FFC7170FD508C12B3EC3EACFD52340E8AB0F16FA0055601350990265B40143E10D25DCCB9C0F17FBEDEA02AAE63DFDEA1E49CF162C949E9D0069809E5280BAE56DFCA1BCD48A77A486B82B5494E88164E8F38A033E8B7E90B676F6FB59D99B17EC7C87C048A5299913B4080959BA25893A8479A7DB3B483C5648DB1E2795F81FB451E7DF1D3184E12B5688FA92D1A8257813F713E04C15592BDF52F08FE57F2DAD9C3E46B198FAD00B869A33FBC2DAAE67EA6912D10FAD2D28C41BDA1C080972B1C5C9A76F3815B19064292605BE3873D3070B621B8AAE7BF91A48EAEB68919B88F11CCC181C027E3755E36780E4A1E21F7E52B881D38CBC1FE6DF6331F7768EFB3F2396BF9FF820B430037BB75FF449D37C858C8687F4F2BBC208C7F033FD14864F526FE6D4E9D5A02C3A617129ED4B37BB82FB761C5713834EE33B059EC00C89F416DE14F84661B2C0B1B86DB3E68E32C9B885B4AB94E149927B3158B83A2E1191508D5A13D86CC966BEF7B1990BFCF2CF376EFD04881B0FD3619B076F6FC83DBBAD94DAA8EB8B99AE67AEE3882DBAD237B30CB3521228BA5F225C357FF2B7DDADCDD1AA4D7A8758D4F61D66246640A0288AE9EB8E685F1BF5BAAA82D79CEA7A74A4220D52021A1DCC84FEBE1838A8CC95E920867D58E90FDE06589581687B060FE3DB0A296D72F3AEE611228B495C043EA8C4547643328355228219F8BA285FC15A61CA969FF572FBCEA2997D23E5F3796E4914EC9806A2C5EAB1A6C310614D9DA09B5050DBE85EB3C447C460FF7FE8EC2423FCC3D7FCE8DB37B9E145DDAA25C45EA48C7BB0B4F4FAB23B3561835653579F0C72F6A7937D9C0322CA293EE8D90C4464199EEFBDBD94016314055157081D091250F4FE4A7FA04866FFAF6D3F266164E543D2F38A7238745F467101A54F868F8CBC2CBB9AE09AAF660E00870CFA10348732A83DE5D30BEB80A2D4F63D3B1EC1AD291A474624279C85F3EF87A01F3FE9053C22F8F9901459DAF262C3726688DE4CE2D12C8125EA99956291011870D4A545527FC71FCCFE5596158A9B57209DDEB01D80A86CC0DAED783315771A07D1358371D272E5022C595403E45216B4E554CE7E91F0BBA64DACE176A01AED2368F0D7B4425F43C23F5ED1F9B3BA80323B3181E82E41F1F6FE68D4C5215903058F72A815935DBB6402BB6E0E8C871DFD2745F399FFA9EB60905F28D93185380885C1DF1C6BA3A54E71C51DF8AD96A6CA6BC65A3A5D6C89BDDD5A8C35346D48CE2169DA90F622F38496BD3B37F706C13C74D654C804EC65FE9639B899D5A36031A06C6BB8616C148DD2237FD1F33023DB54A4EF27EF1E796DA3FCEAC97D85AAD27B96886B54C7D057DECC345254616B38E05C750309DAB565EC1E46EE837C28E90DE2BA17D7295D39FED8F0BB208D247CED59E9169D186B4DD8F7159A943BF712E58ADFC9E04FF2D0597C9A5F546FDDB2BC672C58AD346F8DF36DCDD360273ADCD8A4F12C557ADB4334B973DEEB417952BE566779FCABD079225E439CE4923FD27E1857DF71816DCFB534F5522AD7D797ED49BBD15CE8178D3446318FBFBECCEDA66FB7FE76BFEEA575557292E17F406CDF7E777A32B5BB9F89236D29373D786409D1E08AE1964B676A7792800B8ECBE08BD32A9A4F9519BF7FBC1601A84C9E6226A7C00EE44E3E02F8EEF83559C041C5D4D48708323C6B3DC84BC5752981A32BD11D501D410D05C65C5E90B7DD89268940E4EEA367184D2757E91FF1A64B9AB7943113FB38839C2BF12A15056AC4C5E0200846AAF26374A2AB1EFEE76CACB99B0C0CB1E6B3A0F84D6EB6953EE977EB7C53FD107DE151E4E4F993AC54F7A4898D0771191870A39837C85D89F9596AB90752C2F304DB65372C4E8953A6F17CEFE65F8472D327EFD2AC88D71FB665EC0413AFB434DC7D50F98F09650896AEEFA14064451B6289AE68771BCD0E26ECA5F699AA47E1CC6B9A9959CC0847F76914C1C52674ECF0D25C8BDD28DA407F1D44C8934B21769B73C9208E3621B1AD255D8E28338ADAC49560E69A244CB9F756E4FC410ACCED11490C62A821A012A890FF654A38949C6077D09011032D6D5EA2E4316C0C8178426C3192814B5BBB2D32F7822C094A3C8CFAAD9DDE1E6F71EA77032FD5DFFCEF562DB7DFA59620893363A51F6964C19C8DA9C3E16B611BF9F77689B1B67A9FF57734556C1C1F171396A081366FB64DB3B1E40B4DA6E8E85214BA3D228E64E482847E2D75BFBEAEF724F38E3E68F85089748A9E32E52D9FDC713769BED512ABBA9FF85A0C7F300B5D3E5F92CD5A77DDB215278178A4E015E012440EF72C9DF971120201191EF0952C9687ABFDCF13BA686E41AF0711963988F5BD3BBF66C084D3AE14A5774F1666BB82A0C3102B8FD04D6CE0A0A89155B5F7D1BDD2FC9C05A7445A144C826F7613EA0B4D28B1CA72412E8D60E857A9BAC7C664C3C79D805EBBCAA66D6865E3EC2730C615D699E1B5C6FE905932E261F8F7BAA3A737A29743295914DA0EC6059F1B7671B30C5A73C42022797FB5058D69E7C3FB596BE3040D5405B53FC8A79018AB537D8A5B4ACD881635919D4BCE881B73184F44C94BBA18B83B13D7F21ACFFFBAD2B3235C4F8D08BF3B0A24254155E125E525333B46D4BD416616AA2BBB29482D00220DC95EDC223A6E33DBD2412B1350A680D26E72330051A37CD8F72D8B3996FD37C8BF64BD1D7FE06091001A79EF4AFF735A1DBA616F6FC59D4FD5BD22B280274C36C9F49EA3506838F0F8E23E5882C0A8E7F0D38FFDA1ED816FF54A4B123530A875B817FB5EAC1A8198DBEC3861357540A31E47CFDB3A73FBF2010E04585DE7D0CEEF3837259C858EBDB6AECCDB749F1E5012E20478D3C5435ED4E56BA3BDD8329B995DD94AB9DAF7AFD231D8CD9428EADB62BBAD6CDEE6D2DB39D522D81341406C8CC759711299A694E2E3C98F8049D897B9676714C9B6586DCFD2B544E06E56BB88075243B275B392D48A9D37BBF0ABAB07C77731708F26F7608E6678BF9BFB22FDA58ACA6C80E7026D2E02D7F7411D7B114667D2DBC5F1A8BD2721B1EBD6D9C9DBB7524C0492358B7B43C01D2C989E452F4B0C26B1BBC687A01717E8D90AD57826C0F2B5DF93454C2D6E726546FB14A49B81FE5488462A58F6493CED18A4255BA182E2698B1E016D7C73D66D857E5114CB893001E623772515DEDE916704CDD6A708CD6B4207D2D49D07E0F6DE02A7BD4D464AD70CF3A5DAA1F5144FB9E155BD8B94BA885BC62E8136B7DC1ACDB4E58C45B66689AF2940D4D7D289ABC29804E49A64EB815639D398FA39859616026EA830A9EBFC4370ECE6BE077D6A7CCA530277AFD796718F4C66D403193C1F2C6C8C9CB821428B7A71A83D7C55790BFD0CA052334D28317285155CF80F91D6F9A25A5E4AC047A82EE203758789AD935B38A0A07ED0B3AF8DB72AC154CB84AD41AE5372CCFE728D224FD404562660DAF3E1356265FA87F6A2BDD7C28BE92FCCA46EF24608C4246FE3BE737C089C7013E30C2579045A3ADF42ADD39B7472F98510D5CC16E16C1A6C7241E0BB751A592D7E79F464CACABEC8EB412940C0089F14EDE9D927EDF99A5CF0ECC7E3A721D98DCE81428EFD6EB60C9E0E6FF0A4DF8BC68B70E2CBEC703AB770B17FDC125D29FC963D5A650B56A68E0A9765F259CB46FA7584072691CFF9CA7B4910E6ADE05022662C59792773B760E450D54D664A35748C05820474F7176FDD3469AB92F1A2AED805643CDCEFBE77EAD9F3D00596C34CEF240577AAEA42849289E2EA136748C92B734F1F8BD8FAAB72AA3FDFD0DAD7E20C8F922971753375D629B7B817BF7A52CCEFC22585400AE8952CFF24D27B947F48E22A6B91913E0F9938109DBAFED43AC6E79BFB93AAC8FDF3686610F52110D4C30C994A15297A21A003BB9BA1F4317BB001D062A05CDED6F65343BA98C329361A7197E0014CC8197B9112A37B1FD2684DA2714467C3E7B77AB69D7A82CE48E23AF50958744052126C1560CF68124977E5AA429C412EAE5D200ADC177885F0EFFF228BE10B36DEC899A641ADBFAF5B885CB577CC89427C9A14DACF7C4DDAA5796D576D1EC28413B4D576EF5EE4B6A2AC9C8E052461614C3E7809E337F712956E49A19C6118B10B6C4139E991B3F78829D0F8D82E1B8FDD5A719137E637010DB7D93A132470B4810E5119BE584720C4F0345EDB7FE8F91D0E36557F036A016571CF492B1AA079A4CFD842A8CA65379A4100D2F3DF86EFBF7D7DD93E5E16D73FBA3D42D76569B610343FE3E0AEA3B1409186BEC4D2C641AF6024DD5EA67AD498203C73CE5911B0FBBD41D8B40E6719BFFE97D7CEB2F817369E82149BA2C513DE405CEF35CB03AF27403563B2B628CD788C1E6DE3A5DFEAF1564B4ABE704CB43A4C010C03F19409D56C06132917964138C7C2B9D0C08A0A5BDE7E211793987485804912B3A09463FDBA6A17E9EE49AAA1BA992908605FF028E3145F1152D837EFEDA543B23AEEA5C0920AD53A8EDD099C2ABFFED1D3EFE6FBD2014AF2A0DE50200E0AFC9B2349FB7372346C06AC05AD55E1B1B484E2B22DC8A09C219BC24BD915893C136AA3693C9DC4050F167EB6C91F0509AC4FEC5CA95AB21D3B52F7262B11DB79E10411A6610CAC978D8C4F700FD8B6D9274B8CA5255D06253AD61B960A51C9D40206253FBAED2C15EECD91205F3CF71EA81FA9D21E189716961C95263E0F42B9FAA2B328922EF7EC5DD4309460DD4BE7E3FC4B4C77BE745CD7EE2E7B88E1AF84E62C6564B9D8EBEAA5D095019F1996BEC4509DCF99B389FF43C86A6E0D31A9DA69CC04939867EF053D384D241F2767FFD64107D9FEB1119C9F502ECBD02EABAC0D88F8404B7ED1AE89180323014D1C909987570C11526840909DCFA8A278535E5F08DC59183E2AEEB56D109E4C86214F7D3A695AB63460DC065949C5EFEE5F3CDE0E5388CA4F0FD6B1515D47162ED5EB7CF64E774D3B61630B4B07BC1F49BDA67FFB1B6F590F59BDC0B33776A0ABD5D70F1090C844097593524937708D00CDAC93C85D3E5EF386CEAE44BF0B825451A3A920C6C62377A654502CB632D87053C9B9129096FF410E3ED73A005DF989098F88C5B0FB5CA3C858B7D1CB53B4A2ACD89FB1D42FA0F434A608AB433212936EB483D576CA0F5828DDCE8CC3FBA3EC28F33626F6F7BFB7830F8828974C666DAEAECED1112E1A6F6C695D4984F0B830B6A90574EBF67D254EF50222B7294D2338BE32BE830A00F20BEBDAA73D7D55A4CACF32CB09A28656A7F8C547D317A9EB21D16778C6456CD17DBA38E2D2398779DBFA828466958F3B0116C53117CDA6B32D06572F6A61CF0774459C593E4D8150BE1FD3DBB4CFD2692B35E12E083B09296017E8D1ED701E8006ABD039C82D7C4CA8BE4940CEC9721DAC4712B2521D2DEB9A4144A95C42DD42CB6A588FD1087022D32FFD2BD845433F81B97BF5094CE713B0D081B599DEFE95DAC8B4E116C662E014E767B2458E5814A5EEF148BF160E2E405ABA8B4A8BC31B6556DF4076436D89222B8912B6792B307FF10CAFBD916397B2F8EFB51ADB62054726171981E8F60774429A80ECB321AC1D648C0E14EB6512C4B215383E6873663CA1F1E8C73590A78E4A85C28019BCDE80F37569FED7F1EADEE31EE55C167E0A1DB0F7095D087CF554D61CAEFB2325A7483F1881101FDF4DB88CC63CA7772D359A20BA0DEDFA93A667E23976D0D5079D375AD612C92FC91B43DAFBA37AB4616BFD881CF1499D3033F84840502CDF56135EA3C4F7321E72BDE28059D620E0D20CDBE71C6290914052F78B6E263A8EA40BEF2E193EC6F85230C61D8CCE984766939E029253592244D0AE45DA2E96EE52CC4883D1C5E01C8F1F2FA93D782BF828099B8306241CB0FE85E4BC9C8796CBA7118C2D1F9037433E08AD6975CB83D1F67307B1066DCD2B2954AA0491F13D585899524EE87A316B458FCE49253BE08BBCE17C46A176B6013B8D23B37431F5226DA99E2D3720A06E904DAA1E502B93A550BC8286AD245F5BB410A11FB9868747A46B5F1CAFCFE997CE79D7522152EA596D6A887EDC0E0016C19419D73A39017A971AD0C44B60AE2142E89392736668D972EC8C222B6F5081D1795B3BA8D893308CF99697DBFBA593F11ADEB36E6FA1E2A01E815E536F871A23C7497860678219960EA1761726E9BE0B3456F8614060BD0D76B7D480DBB93FA1C377A9FDA58B3731F91EF4B9F3A1B303BC98B7F1B5437513BD53734E135B99A5DB690FB18BE399F2A74847F53CF8615D71B2E30A9FA46F053C56982F9EDA389906E73A4C7586CB36E4E2D787F628C8BF7F9EB335682D84D621A2C2F1F080A7FF5C45B225239EB0018A6D1F192FCDD30C8A40DCCB6AABFAB16D3D28F754565ADBF86F8DFE743546D05C1D84F8B7C3DC4A7778012C977B7378EFBCBD15649974A580C82261D911A8F29981DBDBFDB0D0519EA8B98FF492715C8694B02B1D3C467D4E891A5BCE8CE513DD5C395C287896372199589E8CE15CE27310C006C12D66C14268EB9F3454D8ED81CD5BA58950DE28DCE96AE1C7C39507297E29AFD5DC4FA4F67EDAE938BFCC86232B8205AE48DFDF6C508562524F80A99CE7EAAAE846A748456341284A1770AC7E002BA697DB2297AC3350242BD8619BA3A6E50388066AAD97BE27B1CEF65A3E7596EC7A3C2A6FA059B43C26A82BBACE2F488533B34045D712A2F2679E4B5CA559114B20B717C72449770FCE566DCA29300C5002920991A10BB743FEB08589DC0DAEE94543BD8606A3735CE7A812D418F6E19F29E3C7C5335607B38CC7080C00941ABD1F228AA4885C90270888B1CD1D9C782077A5AB61672820179CF1D0A7E67DB4139DAD2339D7FC4538BC899C994FBD8CA801E67C7B2503072D027FF250F5857F7208B844BE67BAE783262DD18E1D8BE996ACB5310166701041BA9DB8D8C757B8D6F737C6705C407D08AE3733328796A4C00B8A08E5A663C222D800CE01B040B19EA8B80DBE682BDA39923767D2C4C834C8608BFF0E688AA983B9D64586FE131A0B9C209FCC42A63672924C92EF294D3E474084239DF24E62EAF706C3521CF3DC2E1111759C7C4D70B26BBB01F0F899C57FE48C3B9DE2322202621CAB627CF866BF4CF5DDC132C6C28F1C73E3C56BEE8C811B092C179F7FDB1C8AA9618F619D67E2B0E821B7C4004888C9C161F824518AF376E8CEA52B6DAF214399BD2DAA2932989E2E5E411117140F3A7B4B1D891A06E4F50871FE7D1C9BD5AFFA81235EC0DF52F94096182D8EA1CF341ED67E389E15E43AD5EE5C8BC4DA9FD8B779225714B4BDD1CB0527437117D19B96585F716C07E74D6B4126708018332C4B059B36EBCC62C37E996DA8041B48900D05AF7C984C929E34DE01DCE5E8F0F7A4654770CE813DE6D45B80A868609F990BE1702F0DC773BB206AFA74E4FAB8DFA7F69DDF52F2BDD2FDB240C9BE8C97750C73FE280A1EEC5B83D672F1B1397C4EE73C8CB1E1274655932CC968E7A5D32A202D11AD705D7459F10BF1439BEF82FE5B88F63B76920585AB18F6482D1FE1E6314841868C92F9B857180048A0730F1EE2B24F7BCBDCFEA01D672E48178B37A6EE1D23B8BECECA1A50669701505175B06864013620EA6E023015F22BB27BE0E52B4D26DDF0ECAE3AB6DF0CC5D04D78F6971339D7E61C8A3F430622AD2A8DA09C360D34556FF9B4BB6A6A005C0960F62251A3F70DD14B557A4BB3CBFF9458FB6FF7CF47E6DFE6DCB2382A87596380E514727465F5AA2C5CC743236B1E5A6383D02753D30F665A43B1210B03D2CAD2CE7E87EFCA7DF891C146DB02BD376D0144AC0EFF048341B33643723D2227F9D22457ABE46B019B635A530760D3801830DFE39C225D115ACDD9CBE61705D978C6AEA6301FA1EEBC273343BFE4F5CE8BC471F0448B83518DB505E14D400488AACA2511B694C9D5CE72D00092ED4ADF6CB39C77F4402944434D1D2B4F1A5F5D4CC59011E7B349C8DE101170DB51296FA332E19CC66CF6A01E7B4A41A0492B8EE780070AB890E5E5BDEBFB9BA7D4D6C8ED5D26FD513B0F2F6B2438984BD32E3F27ECF50D4876E1C2E6DC4EA9ACE27849B80F9AF80F62172A746856D659C59D1BC6FBEEA01C630EC87E1C356F1D1D1A316E0E195FEABE4E87ECD82582A750E87C5E71D7C984C1E217F97058E444517DDD5B98FFA2B9489C822BB1442209CC0450AE47913BE97D131535391511F6454BBBDD0383BF1D1FF441D908125A216710B16B1263E5D988EA8FF6D1F2577EFEA9F0C11A2EDB27446AF0EF18569BE0B5814F2794F78C34D86A44F498E34602DD962FD83059DE6B1AD7508C1F4B8F65483AE31AF553C6DE50727DE4EBD21212ADD50A59ACA9A184D69F4965E6B2BE01C47A4415F5C82CF0821E4796EE70D29A1E018405756A3D632255EF8A84BFBFF5203E4FF353010F60FC1D08FA0F9D0EFB907715807EAD36FED10DDB443F961BD1CCDF5EDD2BDE8A784B99E413F17ED7820129213E42886680267A4952EBDEF37E636958FA0899E31828B020CAA5E602E7CE2E18FA43D1CBCA865BA22489E19124E48AB6732CC073856B35C28BF5BB006E8D6A028C015F6371306ED8B413717AB12C855C24383CDAAC321D553095D31115C0F106D9C640BA37792B5E1F09E2392CF4EB01D2B74412D9DDF9ED3D1623D627AD4345AC60BC36D064859481B164685AFDED3FC61F0EB10F4D954600533C47C04715D9BDE6FE6BC8A7A6E607F08CAF50580A9562138DC2970532439F46A0358813FA948CD83195C5C3CCCB32C1D55FCD8D19123DD54419E1DD930880CC22627AFFA397D21A67F85CB21ECD54D4C318937C46EA7A45B73B07960924BA2B30C50F106F50D88EE38473378B21F59F3B653FBD61126F1BD12020718E066409C2D95A00879B708CD176A7F1565744B946D77290398371A7407D6CC46DFDC4560A2D29BDAA59E93242A006FAAE496185E31FB1ED639AE3B1343AA5524B3602CCCA6BF512970FAF72D1A949DB9C2B6EE4945F03793567C24E575963D8277D1FE2425EB091E23B67BAAF87C292C2D2D49324DD32F916B858132EDC9B910C1103F486931789145A466F089BBA4B1733A5072444F1414436FB23A0EE25959FC7D17A1ED547B695626336E19C1F8B4BE7473DEF433BB54ED7A0C415F5FD1FAA2AD2871359A7C5DD5556EAC82BEBC61B7F0D8094A8CA83F8826DF9CA899CA35999630079C89D14ADE6ABCB8068D536F1AFA62FDC7FFFE7456810934FBB60C23FD2E24E75F38E28BE9E83F8FDE946511C29648C1A5BDEEDDD83EE6A0F0E05B3E5EB6A86DDFD1FF5AD77BEE640E2BF95C0A60E26EB964F56C5AF9444A6044846452B9B36D45E02150E5253570F149BF542B81A94B8FEFE825F0B8857E6A1849A7D119DC4E0595DD8CF9F0E44FA2466D443C0598E7425E1CC262596A7C6520E4FD956DB86A207D6FA9CE5D4FA84D4615C251F9373BB1E1680136778484ABEDAE102CFF11066CDD09AF50DDA21348E482396AB672AB08160BDDEBFD068B397152C7A645D81758CC2CDABD42BDF6F63EA4D753D64F4D4032F32F592F862191774C15E16A51AAA7E70DDBB419E78D7BB177A0C17480EDB149EFEC01A89871348F6503393AE73168B701D97BC90C85E57B155C6055C831CC4A44D8490A03C0DEE775B9C68035DF859260893E71887995B1785740C40EA5EFCAEF21C24E84D663A3862F7C3FAAF4AB93D452806CA05103C28799120AB9ECA0C8BB969E2893B20AF1FCD733C846D6F8818D0393E102EE0C43D0EEA0E364F944CE5D3B339F5E12B4FD649C84190BC01171BC4AD7ABC678F800D8A8B77676484B7016727806C1361A275C59332690E99B0E835456E8C30B124B959355ADA570EA5B806CA2A3379B35A5E93E3C59B7A7024F2B1492AB05B75F6304D1D3EC67B42926564D0A7308C7B08C455B716065A83B1884F72F5FEC16640EDBB3B5EF296669B1E8E66F63B04CCFE3430ADB716964CF9662746AA9CDC900DA9829C235B1FC4B9AADFAFC1AF19211B0A91FCA37EF5AF705093D6EB3CB64C4C77F4B3A988A86D532EB9986E6CC6727A5F94A6A4D6EE836A18B1305E059793E9DB6F11626D697CB94FCBF918D2CAF3AD610590DF3CE023D38D75B79678B416FD42594ACB3F9ECBB737A19FE2C8968BACAE80FE3A63F7E628474EDD94A356B0B3FB8FC951859FBE99C74B85AC7BED53145320F2D2D357493EFD8F2CE58ADA2A9AD6B7DEE475A5B5789DDF78E9C15560964A461409A0CBA0A01816FBFC801CAF627B3362CA625508B435F849058D5144586A5EED1E6153C02903D86FCCCC5")
//);
//        System.out.println("Encrypted text back to plain text: " + decrypted);
////
//    }


    public static byte[] toByteArray(Object obj) {
        byte[] bytes = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);
            oos.flush();
            bytes = bos.toByteArray();
            oos.close();
            bos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return bytes;
    }

//    public static String encryptString(Object s) {
//        byte[] result = null;
//        try {
//            ObjectMapper mpper = new ObjectMapper();
//            String ss = mpper.writeValueAsString(s);
//            result = encrypt(ss.getBytes());
//        } catch (Exception e) {
//        }
//        return parseByte2HexStr(result);
//    }




}
